/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Ui;

import java.awt.Color;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.regex.PatternSyntaxException;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.ListSelectionModel;
import javax.swing.RowFilter;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

/**
 *
 * @author Esteban
 */
public class PanelGenerarClase extends javax.swing.JPanel {

    /**
     * Creates new form PanelGenerarClase
     */
    public PanelGenerarClase(VentanaModuloHorarioEstandar ventana, int modo) {
        ventanaHorario=ventana;
        this.modo=modo;
        initComponents(); 
        initComponents2();
        actualizarCreacionClase();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        scrollCurso = new javax.swing.JScrollPane();
        tablaCurso = new javax.swing.JTable();
        scrollProfesor = new javax.swing.JScrollPane();
        tablaProfesor = new javax.swing.JTable();
        scrollEstudiante = new javax.swing.JScrollPane();
        tablaEstudiante = new javax.swing.JTable();
        campoBusquedaEstudiante = new javax.swing.JTextField();
        campoBusquedaCurso = new javax.swing.JTextField();
        clase = new javax.swing.JLabel();
        campoBusquedaProfesor = new javax.swing.JTextField();
        pofesor = new javax.swing.JLabel();
        curso = new javax.swing.JLabel();
        estudiante = new javax.swing.JLabel();
        btnAgregar = new javax.swing.JButton();
        horario = new javax.swing.JLabel();

        scrollCurso.setBorder(javax.swing.BorderFactory.createTitledBorder(new javax.swing.border.LineBorder(new java.awt.Color(153, 153, 153), 1, true), "Seleccione el curso:", javax.swing.border.TitledBorder.LEFT, javax.swing.border.TitledBorder.TOP, new java.awt.Font("Calibri", 1, 18), new java.awt.Color(0, 102, 255))); // NOI18N

        tablaCurso.setFont(new java.awt.Font("Calibri", 0, 14)); // NOI18N
        tablaCurso.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Código", "Curso"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.Integer.class, java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tablaCurso.setGridColor(new java.awt.Color(0, 102, 204));
        scrollCurso.setViewportView(tablaCurso);

        scrollProfesor.setBorder(javax.swing.BorderFactory.createTitledBorder(new javax.swing.border.LineBorder(new java.awt.Color(153, 153, 153), 1, true), "Seleccione el profesor:", javax.swing.border.TitledBorder.LEFT, javax.swing.border.TitledBorder.TOP, new java.awt.Font("Calibri", 1, 18), new java.awt.Color(0, 102, 255))); // NOI18N

        tablaProfesor.setFont(new java.awt.Font("Calibri", 0, 14)); // NOI18N
        tablaProfesor.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Cédula", "Nombre"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tablaProfesor.setGridColor(new java.awt.Color(0, 102, 204));
        scrollProfesor.setViewportView(tablaProfesor);

        scrollEstudiante.setBorder(javax.swing.BorderFactory.createTitledBorder(new javax.swing.border.LineBorder(new java.awt.Color(153, 153, 153), 1, true), "Seleccione el estudiante:", javax.swing.border.TitledBorder.LEFT, javax.swing.border.TitledBorder.TOP, new java.awt.Font("Calibri", 1, 18), new java.awt.Color(0, 102, 255))); // NOI18N

        tablaEstudiante.setFont(new java.awt.Font("Calibri", 0, 14)); // NOI18N
        tablaEstudiante.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Cédula", "Nombre"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tablaEstudiante.setGridColor(new java.awt.Color(0, 102, 204));
        scrollEstudiante.setViewportView(tablaEstudiante);

        campoBusquedaEstudiante.setFont(new java.awt.Font("Calibri", 0, 14)); // NOI18N
        campoBusquedaEstudiante.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                campoBusquedaEstudianteKeyReleased(evt);
            }
        });

        campoBusquedaCurso.setFont(new java.awt.Font("Calibri", 0, 14)); // NOI18N
        campoBusquedaCurso.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                campoBusquedaCursoKeyReleased(evt);
            }
        });

        clase.setFont(new java.awt.Font("Calibri", 1, 20)); // NOI18N
        clase.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Img/CalendarIcon.png"))); // NOI18N
        clase.setText("Crear Clase Compartida");

        campoBusquedaProfesor.setFont(new java.awt.Font("Calibri", 0, 14)); // NOI18N
        campoBusquedaProfesor.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                campoBusquedaProfesorKeyReleased(evt);
            }
        });

        pofesor.setFont(new java.awt.Font("Calibri", 0, 16)); // NOI18N
        pofesor.setText("Buscar profesor:");

        curso.setFont(new java.awt.Font("Calibri", 0, 16)); // NOI18N
        curso.setText("Buscar curso:");

        estudiante.setFont(new java.awt.Font("Calibri", 0, 16)); // NOI18N
        estudiante.setText("Buscar estudiante:");

        btnAgregar.setFont(new java.awt.Font("Calibri", 0, 14)); // NOI18N
        btnAgregar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Img/agregar.png"))); // NOI18N
        btnAgregar.setText("Agregar Clase");
        btnAgregar.setEnabled(false);
        btnAgregar.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                btnAgregarMouseClicked(evt);
            }
        });

        horario.setFont(new java.awt.Font("Calibri", 0, 16)); // NOI18N
        horario.setText("Horario seleccionado: ");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(82, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(scrollProfesor, javax.swing.GroupLayout.PREFERRED_SIZE, 667, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(scrollCurso, javax.swing.GroupLayout.PREFERRED_SIZE, 664, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                .addGroup(layout.createSequentialGroup()
                                    .addComponent(clase, javax.swing.GroupLayout.PREFERRED_SIZE, 297, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                    .addComponent(horario, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                                .addComponent(scrollEstudiante, javax.swing.GroupLayout.PREFERRED_SIZE, 664, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addGap(80, 80, 80))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(btnAgregar)
                        .addGap(333, 333, 333))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(curso)
                        .addGap(78, 78, 78)
                        .addComponent(campoBusquedaCurso, javax.swing.GroupLayout.PREFERRED_SIZE, 364, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(173, 173, 173))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(pofesor)
                        .addGap(59, 59, 59)
                        .addComponent(campoBusquedaProfesor, javax.swing.GroupLayout.PREFERRED_SIZE, 363, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(178, 178, 178))))
            .addGroup(layout.createSequentialGroup()
                .addGap(107, 107, 107)
                .addComponent(estudiante)
                .addGap(44, 44, 44)
                .addComponent(campoBusquedaEstudiante, javax.swing.GroupLayout.PREFERRED_SIZE, 365, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 0, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(20, 20, 20)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(clase)
                    .addComponent(horario))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(scrollEstudiante, javax.swing.GroupLayout.PREFERRED_SIZE, 121, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(campoBusquedaEstudiante, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(estudiante))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 18, Short.MAX_VALUE)
                .addComponent(scrollCurso, javax.swing.GroupLayout.PREFERRED_SIZE, 121, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(campoBusquedaCurso, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(curso))
                .addGap(22, 22, 22)
                .addComponent(scrollProfesor, javax.swing.GroupLayout.PREFERRED_SIZE, 121, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(campoBusquedaProfesor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(pofesor))
                .addGap(18, 18, 18)
                .addComponent(btnAgregar, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(16, 16, 16))
        );
    }// </editor-fold>//GEN-END:initComponents

    private void campoBusquedaEstudianteKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_campoBusquedaEstudianteKeyReleased
        // TODO add your handling code here:
        busquedaEst();
    }//GEN-LAST:event_campoBusquedaEstudianteKeyReleased

    private void campoBusquedaCursoKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_campoBusquedaCursoKeyReleased
        // TODO add your handling code here:
        busquedaCurso();
    }//GEN-LAST:event_campoBusquedaCursoKeyReleased

    private void campoBusquedaProfesorKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_campoBusquedaProfesorKeyReleased
        // TODO add your handling code here:
        busquedaProf();
    }//GEN-LAST:event_campoBusquedaProfesorKeyReleased

    private void btnAgregarMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnAgregarMouseClicked
        // TODO add your handling code here:
        agregarClase();
    }//GEN-LAST:event_btnAgregarMouseClicked

    
    private void initComponents2(){
        horario.setText("Horario seleccionado: "+ventanaHorario.getDia()+" "+ventanaHorario.getHoraInicio()+" - "+ventanaHorario.getHoraFin(ventanaHorario.getTablaGenerarClases()));
        scrollEstudiante.getViewport().setBackground(Color.WHITE);
        scrollCurso.getViewport().setBackground(Color.WHITE);
        scrollProfesor.getViewport().setBackground(Color.WHITE);
        
        ListSelectionModel listSelectionModel = tablaCurso.getSelectionModel();
        listSelectionModel.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) { 
                ListSelectionModel lsm = (ListSelectionModel)e.getSource();
                if(!lsm.isSelectionEmpty()){//se revisa que cargue la tabla de profes con ellos 
                    //cuando se tiene seleccionado el curso siempre.
                    //cargar profes activos
                    cargarProfesoresActivosDisponibles();
                    seleccionCurso=true;
                    puedeAgregar();
                }
                else{
                    //desactivar opciones de profesor
                    //ocultar tabla (visible) set null en contenido de tabla modelo
                    vaciarTablaProf();
                    btnAgregar.setEnabled(false);
                    seleccionCurso=false;
                }
            }
        });
        
        ListSelectionModel listSelectionModel2 = tablaEstudiante.getSelectionModel();
        listSelectionModel2.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) { 
                ListSelectionModel lsm = (ListSelectionModel)e.getSource();
                if(!lsm.isSelectionEmpty()){
                    seleccionEst=true;
                    puedeAgregar();
                }
                else{
                    btnAgregar.setEnabled(false);
                    seleccionEst=false;
                }
            }
        });
        
        ListSelectionModel listSelectionModel3 = tablaProfesor.getSelectionModel();
        listSelectionModel3.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) { 
                ListSelectionModel lsm = (ListSelectionModel)e.getSource();
                if(!lsm.isSelectionEmpty()){
                    seleccionProf=true;
                    puedeAgregar();
                }
                else{
                    btnAgregar.setEnabled(false);
                    seleccionProf=false;
                }
            }
        });
        
        
    }
    
    
    private void busquedaEst(){
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tablaEstudiante.getModel());
        tablaEstudiante.setRowSorter(sorter);
        if(campoBusquedaEstudiante.getText().isEmpty()){
            sorter.setRowFilter(null);
        }    
        else{
            try{
                sorter.setRowFilter(RowFilter.regexFilter(campoBusquedaEstudiante.getText()));
            }catch (PatternSyntaxException pse) {
                System.err.println("Bad regex pattern");
            }
        }
    }
    
    
    public void cargarEstudiantesActivos(){
        Connection conexion=null;
        Statement sentencia=null;
        ResultSet resultado=null;
        Object[][] estudiantes=null;
        
        try {
            Class.forName("org.postgresql.Driver");
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try{
            conexion = DriverManager.getConnection(cadenaConexion);
            sentencia = conexion.createStatement();
        
            String consultaSQL = "select cedula,nombre,apellido1,apellido2 from estudiante where activo='true'";
            resultado = sentencia.executeQuery(consultaSQL);
            int estudiantesSize=0;
            while(resultado.next()){
                estudiantesSize++;
            }
            
            if(estudiantesSize!=0){
                estudiantes=new Object[estudiantesSize][2];
                estudiantesSize=0;
                Statement sentencia2 = conexion.createStatement();
                ResultSet resultado2 = sentencia2.executeQuery(consultaSQL);
                String student;
                while (resultado2.next()) {
                    estudiantes[estudiantesSize][0]=resultado2.getString("cedula").replaceAll("\\s+","");
                    student=resultado2.getString("nombre").replaceAll("\\s+","")+" "+resultado2.getString("apellido1").replaceAll("\\s+","");  
                        if(resultado2.getString("apellido2")!=null){
                            student=student+" "+resultado2.getString("apellido2").replaceAll("\\s+",""); 
                        }
                    estudiantes[estudiantesSize][1]=student;   
                    estudiantesSize++;
                }
            }
                    
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(this, "\n Imposible cargar los estudiantes \n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
            conexion = null;
        }
        finally {
            if (resultado != null) {
                try {
                    resultado.close();
                } catch (Exception e) {
                e.printStackTrace();
                }
            }
            if (sentencia != null) {
                try {
                    sentencia.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (conexion != null) {
                try {
                    conexion.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        
        tablaEstudiante.setModel(new javax.swing.table.DefaultTableModel(
            estudiantes,
                
            new String [] {
                "Cédula", "Nombre"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });  
        
        tablaEstudiante.getColumnModel().getColumn(0).setMaxWidth(95);
        tablaEstudiante.getColumnModel().getColumn(0).setMinWidth(95);
        
    }
    
    
    
    
    private void busquedaCurso(){
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tablaCurso.getModel());
        tablaCurso.setRowSorter(sorter);
        if(campoBusquedaCurso.getText().isEmpty()){
            sorter.setRowFilter(null);
        }    
        else{
            try{
                sorter.setRowFilter(RowFilter.regexFilter(campoBusquedaCurso.getText()));
            }catch (PatternSyntaxException pse) {
                System.err.println("Bad regex pattern");
            }
        }
    }
    
    
    public void cargarCursos(){
        Connection conexion=null;
        Statement sentencia=null;
        ResultSet resultado=null;
        Object[][] cursos=null;
        
        try {
            Class.forName("org.postgresql.Driver");
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try{
            conexion = DriverManager.getConnection(cadenaConexion);
            sentencia = conexion.createStatement();
        
            String consultaSQL = "select codigo,nombre from curso where activo='true'";
            resultado = sentencia.executeQuery(consultaSQL);
            int cursosSize=0;
            while(resultado.next()){
                cursosSize++;
            }
            
            if(cursosSize!=0){
                cursos=new Object[cursosSize][2];
                cursosSize=0;
                Statement sentencia2 = conexion.createStatement();
                ResultSet resultado2 = sentencia2.executeQuery(consultaSQL);
                while (resultado2.next()) {
                    cursos[cursosSize][0]=resultado2.getInt("codigo");
                    cursos[cursosSize][1]=resultado2.getString("nombre");   
                    cursosSize++;
                }
            }
                     
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(this, "\n Imposible cargar los cursos activos\n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
            conexion = null;
        }
        finally {
            if (resultado != null) {
                try {
                    resultado.close();
                } catch (Exception e) {
                e.printStackTrace();
                }
            }
            if (sentencia != null) {
                try {
                    sentencia.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (conexion != null) {
                try {
                    conexion.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        
        tablaCurso.setModel(new javax.swing.table.DefaultTableModel(
            cursos,
                
            new String [] {
                "Código", "Curso"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });  
        
        tablaCurso.getColumnModel().getColumn(0).setMaxWidth(65);
        tablaCurso.getColumnModel().getColumn(0).setMinWidth(65);
        
    }
    
    
    private void busquedaProf(){
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tablaProfesor.getModel());
        tablaProfesor.setRowSorter(sorter);
        if(campoBusquedaProfesor.getText().isEmpty()){
            sorter.setRowFilter(null);
        }    
        else{
            try{
                sorter.setRowFilter(RowFilter.regexFilter(campoBusquedaProfesor.getText()));
            }catch (PatternSyntaxException pse) {
                System.err.println("Bad regex pattern");
            }
        }
    }
   
    
    public void cargarProfesoresActivosDisponibles(){
        Connection conexion=null;
        Statement sentencia=null;
        ResultSet resultado=null;
        Object[][] profesores=null;
        
        try {
            Class.forName("org.postgresql.Driver");
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try{
            conexion = DriverManager.getConnection(cadenaConexion);
            sentencia = conexion.createStatement();
        
            String consultaSQL = "select cedula,nombre,apellido1,apellido2 from (select profesor from profesor_por_clase where curso="+tablaCurso.getValueAt(tablaCurso.getSelectedRow(),0)+")alias1, (select cedula,nombre,apellido1,apellido2 from profesor where activo='true')alias2 where alias1.profesor=alias2.cedula";
            resultado = sentencia.executeQuery(consultaSQL);
            int profesoresSize=0;
            while(resultado.next()){
                if(!verificarDisponibilidadProfesor(resultado.getString("cedula").replaceAll("\\s+",""), ventanaHorario.getAnio(), ventanaHorario.getMes(), ventanaHorario.switchDia(ventanaHorario.getDia()),ventanaHorario.horaConverter(ventanaHorario.getHoraInicio()),ventanaHorario.horaConverter(ventanaHorario.getHoraFin(ventanaHorario.getTablaGenerarClases())))){
                    profesoresSize++;
                }
            }
            
            if(profesoresSize!=0){
                profesores=new Object[profesoresSize][2];
                profesoresSize=0;
                Statement sentencia2 = conexion.createStatement();
                ResultSet resultado2 = sentencia2.executeQuery(consultaSQL);
                while (resultado2.next()) {
                    if(!verificarDisponibilidadProfesor(resultado2.getString("cedula").replaceAll("\\s+",""), ventanaHorario.getAnio(), ventanaHorario.getMes(), ventanaHorario.switchDia(ventanaHorario.getDia()),ventanaHorario.horaConverter(ventanaHorario.getHoraInicio()),ventanaHorario.horaConverter(ventanaHorario.getHoraFin(ventanaHorario.getTablaGenerarClases())))){
                        profesores[profesoresSize][0]=resultado2.getString("cedula").replaceAll("\\s+","");
                        profesores[profesoresSize][1]=resultado2.getString("nombre").replaceAll("\\s+","")+" "+resultado2.getString("apellido1").replaceAll("\\s+","");  
                        if(resultado2.getString("apellido2")!=null){
                            profesores[profesoresSize][1]=profesores[profesoresSize][1]+" "+resultado2.getString("apellido2").replaceAll("\\s+",""); 
                        }
                    profesoresSize++;
                    }
                }
            }
                    
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(this, "\n Imposible cargar los profesores que imparten el curso \n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
            conexion = null;
        }
        finally {
            if (resultado != null) {
                try {
                    resultado.close();
                } catch (Exception e) {
                e.printStackTrace();
                }
            }
            if (sentencia != null) {
                try {
                    sentencia.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (conexion != null) {
                try {
                    conexion.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        
        tablaProfesor.setModel(new javax.swing.table.DefaultTableModel(
            profesores,
                
            new String [] {
                "Cédula", "Nombre"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });  
        
        tablaProfesor.getColumnModel().getColumn(0).setMaxWidth(95);
        tablaProfesor.getColumnModel().getColumn(0).setMinWidth(95);
        
    }
    
    private void vaciarTablaProf(){
        tablaProfesor.setModel(new javax.swing.table.DefaultTableModel(
            new Object[][]{
                
            },
                
            new String [] {
                "Cédula", "Nombre"
            }
        ) {
        });  
    }
    
    private int PK_Numero_Grupo(int curso,int anio,int mes){
        Connection conexion=null;
        Statement sentencia=null;
        ResultSet resultado=null;
        Object[] numero;
        
        try {
            Class.forName("org.postgresql.Driver");
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try{
            conexion = DriverManager.getConnection(cadenaConexion);
            sentencia = conexion.createStatement();
        
            String consultaSQL = "select max(numero) from grupo where curso="+curso+" and anio="+anio+" and mes="+mes;
            resultado = sentencia.executeQuery(consultaSQL);
            int num=0;
            while(resultado.next()){
                num++;
            }
            
            if(num!=0){
                numero=new Object[num];
                num=0;
                Statement sentencia2 = conexion.createStatement();
                ResultSet resultado2 = sentencia2.executeQuery(consultaSQL);
                while (resultado2.next()) {
                    numero[num]=resultado2.getInt(1);
                    num++;
                }
                return ((int)numero[0])+1;
            }
            else{
                return 0;
            }
            
                    
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(this, "\n Imposible cargar el número siguiente de grupo para el que se está creando \n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
            conexion = null;
        }
        finally {
            if (resultado != null) {
                try {
                    resultado.close();
                } catch (Exception e) {
                e.printStackTrace();
                }
            }
            if (sentencia != null) {
                try {
                    sentencia.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (conexion != null) {
                try {
                    conexion.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return 0;
    }
    
    private void agregarClase(){
        
        if(verificarCursoPorMatricular((String)tablaEstudiante.getValueAt(tablaEstudiante.getSelectedRow(), 0), (int)tablaCurso.getValueAt(tablaCurso.getSelectedRow(), 0), ventanaHorario.getAnio(), ventanaHorario.getMes())==false){
        
            if(verificarHorarioPorMatricular((String)tablaEstudiante.getValueAt(tablaEstudiante.getSelectedRow(), 0), ventanaHorario.getAnio(), ventanaHorario.getMes(), ventanaHorario.switchDia(ventanaHorario.getDia()), ventanaHorario.horaConverter(ventanaHorario.getHoraInicio()), ventanaHorario.horaConverter(ventanaHorario.getHoraFin(ventanaHorario.getTablaGenerarClases())))==false){
            
                int numero=PK_Numero_Grupo((int)tablaCurso.getValueAt(tablaCurso.getSelectedRow(), 0),ventanaHorario.getAnio(),ventanaHorario.getMes());
                    int confirmado = JOptionPane.showOptionDialog(
                    this,"Clase: "+tablaCurso.getValueAt(tablaCurso.getSelectedRow(), 0)+"-"+tablaCurso.getValueAt(tablaCurso.getSelectedRow(), 1)+
                    "\nAño: "+ventanaHorario.getAnio()+
                    "\nMes: "+ventanaHorario.switchMes(ventanaHorario.getMes())+
                    "\nNúmero de grupo: "+numero+
                    "\nHorario: "+ventanaHorario.getDia()+" "+ventanaHorario.getHoraInicio()+" - "+ventanaHorario.getHoraFin(ventanaHorario.getTablaGenerarClases())+
                    "\nProfesor: "+tablaProfesor.getValueAt(tablaProfesor.getSelectedRow(), 1)+
                    "\n \nConfirmar creación de grupo con la asignación del estudiante "+tablaEstudiante.getValueAt(tablaEstudiante.getSelectedRow(), 1)+" de cédula "+tablaEstudiante.getValueAt(tablaEstudiante.getSelectedRow(), 0), "Confirmación requerida",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,
                    null,    // null para icono por defecto.
                    new Object[] { "Correcto", "Cancelar"},   // null para YES, NO y CANCEL
                    null);
        
                
                if(confirmado==0){
                    Connection conexion=null;
                    Statement sentencia=null;
                    ResultSet resultado=null;
        
                    try {
                        Class.forName("org.postgresql.Driver");
                    }catch (ClassNotFoundException e) {
                        e.printStackTrace();
                    }
                    try{
                        conexion = DriverManager.getConnection(cadenaConexion);
                        sentencia = conexion.createStatement();
                        String consultaSQL="";
                        if(modo==1){
                            consultaSQL = "insert into grupo (anio,numero,activo,profesor,curso,mes,dia,hora_inicio,hora_fin,cant_alumnos,modalidad) VALUES ("+ventanaHorario.getAnio()+","+numero+",'true',"+tablaProfesor.getValueAt(tablaProfesor.getSelectedRow(), 0)+","+tablaCurso.getValueAt(tablaCurso.getSelectedRow(), 0)+","+ventanaHorario.getMes()+","+ventanaHorario.switchDia(ventanaHorario.getDia())+","+ventanaHorario.horaConverter(ventanaHorario.getHoraInicio())+","+ventanaHorario.horaConverter(ventanaHorario.getHoraFin(ventanaHorario.getTablaGenerarClases()))+",1,1"+")";
                        }
                        else{
                            if(modo==2){
                                consultaSQL = "insert into grupo (anio,numero,activo,profesor,curso,mes,dia,hora_inicio,hora_fin,cant_alumnos,modalidad) VALUES ("+ventanaHorario.getAnio()+","+numero+",'true',"+tablaProfesor.getValueAt(tablaProfesor.getSelectedRow(), 0)+","+tablaCurso.getValueAt(tablaCurso.getSelectedRow(), 0)+","+ventanaHorario.getMes()+","+ventanaHorario.switchDia(ventanaHorario.getDia())+","+ventanaHorario.horaConverter(ventanaHorario.getHoraInicio())+","+ventanaHorario.horaConverter(ventanaHorario.getHoraFin(ventanaHorario.getTablaGenerarClases()))+",1,2"+")";
                            }
                        }
                        resultado = sentencia.executeQuery(consultaSQL);

                    } catch (SQLException e) {
                        if(e.getSQLState().equals("02000")){ //no_data , una inserción no devuelve nada
                            matricularEstudiante(numero);
                        }
                        else{
                            JOptionPane.showMessageDialog(this, "\n Imposible añadir grupo \n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
                            e.printStackTrace();
                            conexion = null;
                        }
                    }
                    finally {
                        if (resultado != null) {
                            try {
                                resultado.close();
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                        if (sentencia != null) {
                            try {
                                sentencia.close();
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                        if (conexion != null) {
                            try {
                                conexion.close();
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
            else{
                JOptionPane.showMessageDialog(this, "\nImposible matricular estudiante en dicho horario.\nEl estudiante ya está inscrito en este u otro curso a la misma hora actualmente ", "Error", JOptionPane.ERROR_MESSAGE); 
            }   
        }
        else{
            JOptionPane.showMessageDialog(this, "\nImposible matricular estudiante en dicho curso.\nEl estudiante ya está inscrito en otro grupo de "+eliminarEspaciosBlancosFinal((String)tablaCurso.getValueAt(tablaCurso.getSelectedRow(), 1))+" actualmente ", "Error", JOptionPane.ERROR_MESSAGE); 
        }
    }
    
   public void matricularEstudiante(int numeroGrupo){
        Connection conexion=null;
                Statement sentencia=null;
                ResultSet resultado=null;
        
                try {
                    Class.forName("org.postgresql.Driver");
                }catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
                try{
                    conexion = DriverManager.getConnection(cadenaConexion);
                    sentencia = conexion.createStatement();
                    String consultaSQL = "insert into matricula(anio,numero,estudiante,fecha_matricula,retiro,curso,mes) VALUES ("+ventanaHorario.getAnio()+","+numeroGrupo+",'"+tablaEstudiante.getValueAt(tablaEstudiante.getSelectedRow(), 0)+"','"+new Timestamp(new java.util.Date().getTime())+"','false',"+tablaCurso.getValueAt(tablaCurso.getSelectedRow(), 0)+","+ventanaHorario.getMes()+")";
                    resultado = sentencia.executeQuery(consultaSQL);

                } catch (SQLException e) {
                    if(e.getSQLState().equals("02000")){ //no_data , una inserción no devuelve nada
                        //si es compartida actualize el numero
                        ventanaHorario.actualizarCampoClase();
                        JOptionPane.showMessageDialog(this,"\n ¡Estudiante asignado y matriculado al grupo exitósamente!","Éxito",JOptionPane.INFORMATION_MESSAGE);
                        cerrarPanel();
                    }
                    else{       
                        JOptionPane.showMessageDialog(this, "\n Imposible matricular estudiante en el curso \n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
                        e.printStackTrace();
                        conexion = null;
                    }
                }
                finally {
                    if (resultado != null) {
                        try {
                            resultado.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (sentencia != null) {
                        try {
                            sentencia.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (conexion != null) {
                        try {
                            conexion.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
    }
    
    private void puedeAgregar(){
        if(seleccionCurso==true&&seleccionEst==true&&seleccionProf==true){
            btnAgregar.setEnabled(true);
        }
    }
    
    private void actualizarCreacionClase(){
        if(!ventanaHorario.btnAgregarIndividual().isEnabled()){
            clase.setText("Generar Clase Individual");
        }
        else{
            if(!ventanaHorario.btnAgregarCompartida().isEnabled()){
                clase.setText("Generar Clase Compartida");
            }
        }
    } 
    
    public void setSuperPanel(JDialog superPanel){
        this.superPanel=superPanel;
    }
    
    private void cerrarPanel(){
        superPanel.setVisible(false);
        superPanel.dispose();
        superPanel=null;
    }
    
    private boolean verificarCursoPorMatricular(String estudiante, int curso, int anio, int mes){
        Connection conexion=null;
        Statement sentencia=null;
        ResultSet resultado=null;
        
        try {
            Class.forName("org.postgresql.Driver");
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try{
            conexion = DriverManager.getConnection(cadenaConexion);
            sentencia = conexion.createStatement();
        
            String consultaSQL = "select retiro from matricula where curso="+curso+" and anio="+anio+" and mes="+mes+" and estudiante='"+estudiante+"'"; //selecciono algún dato, el de menos bytes
            resultado = sentencia.executeQuery(consultaSQL);
            if(resultado.next()){
                return true;
            }
            else{
                return false;
            }
                    
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(this, "\n Imposible comprobar si el estudiante matriculó dicho curso\n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
            conexion = null;
        }
        finally {
            if (resultado != null) {
                try {
                    resultado.close();
                } catch (Exception e) {
                e.printStackTrace();
                }
            }
            if (sentencia != null) {
                try {
                    sentencia.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (conexion != null) {
                try {
                    conexion.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return false;
    }
    
    private boolean verificarHorarioPorMatricular(String estudiante, int anio, int mes, int dia, int hora_inicio, int hora_fin){
        Connection conexion=null;
        Statement sentencia=null;
        ResultSet resultado=null;
        
        try {
            Class.forName("org.postgresql.Driver");
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try{
            conexion = DriverManager.getConnection(cadenaConexion);
            sentencia = conexion.createStatement();
        
            String matricula="select curso,numero from matricula where anio="+anio+" and mes="+mes+" and estudiante='"+estudiante+"'";
            String grupo="select hora_inicio,hora_fin,dia,curso,numero from grupo where anio="+anio+" and mes="+mes;
            String consultaSQL="select hora_inicio from ("+matricula+")alias1,("+grupo+")alias2 where alias1.curso=alias2.curso and alias1.numero=alias2.numero and alias2.dia="+dia+" and alias2.hora_inicio="+hora_inicio+" and alias2.hora_fin="+hora_fin;
            //String consultaSQL = "select retiro from matricula where anio="+anio+" and mes="+mes+" and estudiante='"+estudiante+"' and dia="+dia+" and hora_inicio="+hora_inicio+" and hora_fin="+hora_fin; //selecciono algún dato, el de menos bytes 
            resultado = sentencia.executeQuery(consultaSQL);
            if(resultado.next()){
                return true;
            }
            else{
                return false;
            }
                    
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(this, "\n Imposible comprobar si el estudiante ya está matriculado en otros cursos a la misma hora\n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
            conexion = null;
        }
        finally {
            if (resultado != null) {
                try {
                    resultado.close();
                } catch (Exception e) {
                e.printStackTrace();
                }
            }
            if (sentencia != null) {
                try {
                    sentencia.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (conexion != null) {
                try {
                    conexion.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return false;
    }
    
    private boolean verificarDisponibilidadProfesor(String profesor, int anio, int mes, int dia, int hora_inicio, int hora_fin){
        Connection conexion=null;
        Statement sentencia=null;
        ResultSet resultado=null;
        
        try {
            Class.forName("org.postgresql.Driver");
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try{
            conexion = DriverManager.getConnection(cadenaConexion);
            sentencia = conexion.createStatement();
        
            String consultaSQL = "select profesor from grupo where activo='true' and anio="+anio+" and mes="+mes+" and profesor='"+profesor+"' and dia="+dia+" and hora_inicio="+hora_inicio+" and hora_fin="+hora_fin; //selecciono algún dato, el de menos bytes 
            resultado = sentencia.executeQuery(consultaSQL);
            if(resultado.next()){
                return true;
            }
            else{
                return false;
            }
                    
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(this, "\n Imposible comprobar si el profesor ya imparte otro curso a la misma hora\n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
            conexion = null;
        }
        finally {
            if (resultado != null) {
                try {
                    resultado.close();
                } catch (Exception e) {
                e.printStackTrace();
                }
            }
            if (sentencia != null) {
                try {
                    sentencia.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (conexion != null) {
                try {
                    conexion.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return false;
    }
    
    private String eliminarEspaciosBlancosFinal(String hilera){
        int pos=0;
        String newHilera="";
        int paso=0;
        for(int i=hilera.length()-1;i>=0;i--){
            if(hilera.charAt(i)!=' '){
                pos=i;
                paso=1;
                break;
            }
        }
        if(paso==1){
            for(int j=0;j<=pos;j++){
                newHilera=newHilera+hilera.charAt(j);
            } 
        }
        else{
            newHilera=hilera;
        }
        return newHilera;
    }
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnAgregar;
    private javax.swing.JTextField campoBusquedaCurso;
    private javax.swing.JTextField campoBusquedaEstudiante;
    private javax.swing.JTextField campoBusquedaProfesor;
    private javax.swing.JLabel clase;
    private javax.swing.JLabel curso;
    private javax.swing.JLabel estudiante;
    private javax.swing.JLabel horario;
    private javax.swing.JLabel pofesor;
    private javax.swing.JScrollPane scrollCurso;
    private javax.swing.JScrollPane scrollEstudiante;
    private javax.swing.JScrollPane scrollProfesor;
    private javax.swing.JTable tablaCurso;
    private javax.swing.JTable tablaEstudiante;
    private javax.swing.JTable tablaProfesor;
    // End of variables declaration//GEN-END:variables
    private static final String cadenaConexion = "jdbc:postgresql://localhost/SMAAMDB?" + "user=postgres&password=root";
    private boolean seleccionEst;
    private boolean seleccionCurso;
    private boolean seleccionProf;
    private VentanaModuloHorarioEstandar ventanaHorario;
    private int modo;
    private JDialog superPanel;
}
